package com.gitee.ywj1352.算法.week01;


import java.util.Arrays;

/**
 * 旋转数组
 * <p>
 * 给定一个数组，将数组中的元素向右移动k个位置，其中k是非负数。
 * <p>
 * 进阶：
 * <p>
 * 尽可能想出更多的解决方案，至少有三种不同的方法可以解决这个问题。
 * 你可以使用空间复杂度为O(1) 的原地算法解决这个问题吗？
 * <p>
 * * 输入: nums = [1,2,3,4,5,6,7], k = 3
 * * 输出: [5,6,7,1,2,3,4]
 * * 解释:
 * * 向右旋转 1 步: [7,1,2,3,4,5,6]
 * * 向右旋转 2 步: [6,7,1,2,3,4,5]
 * * 向右旋转 3 步: [5,6,7,1,2,3,4]
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/rotate-array
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Rotate {


    /**
     * 原地旋转
     * @param nums
     * @param k
     */
    public static void rotate(int[] nums, int k) {
        k %= nums.length;
        int temp;
        for (int i = 0; i < k; i++) {
            temp = nums[i];
            nums[i] = nums[nums.length - k + i];
            nums[nums.length - k + i] = temp;
        }
        int t = k % (nums.length - k);

        t = nums.length - k - t;

        for (int i = 0; i < t; i++) {
            for (int j = k; j < nums.length - 1; j++) {
                temp = nums[j];
                nums[j] = nums[j + 1];
                nums[j + 1] = temp;
            }
        }
    }


    /**
     * 依赖临时数组 来使用
     * @param nums
     * @param k
     */
    public static void rotate2(int[] nums, int k) {
       int[] arr =  new int[nums.length];

        k %= nums.length;
        for (int i = 0; i < k; i++) {
            if (i <= k){
                arr[i] = nums[nums.length - k + i];
            }else{
                arr[i] = nums[i-k];
            }

        }
        nums = arr;

    }


    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        rotate2(arr, 3);
        System.out.println(Arrays.toString(arr));

    }


}
